package com.javacoo.xservice.base.utils;

import java.util.Map;
import java.util.Optional;

import org.springframework.context.annotation.Configuration;

import com.javacoo.xservice.base.support.expression.ExpressionParserHolder;

import lombok.extern.slf4j.Slf4j;

/**
 * SPEL表达式工具类
 * <p>说明:</p>
 * <li></li>
 * @author DuanYong
 * @since 2017年7月13日上午8:22:20
 */
@Slf4j
@Configuration
public class ExpressionUtil {
	/**
	 * 从原始数据中获取指定表达式的值
	 * <p>说明:</p>
	 * <li></li>
	 * @author DuanYong
	 * @param exp spel表达式
	 * @param data 原始数据
	 * @return 指定表达式的值
	 * @since 2017年7月12日上午10:54:11
	 */
	public static Optional<String> expressionParser(String exp, Map<String, Object> data) {
		String value = null;
		try{
		    if(!ExpressionParserHolder.getSpelExpressionParser().isPresent()){
                return Optional.ofNullable(value);
            }
			Object obj = ExpressionParserHolder.getSpelExpressionParser().get().getValue(exp, data);
			if(null != obj){
				value = DataUtil.toString(obj);
			}
		}catch(Exception ex){
			ex.printStackTrace();
			log.error("表达式解析失败! 表达式:{}",exp);
		}
		return Optional.ofNullable(value);
	}
	/**
	 * 设置指定表达式的值
	 * <p>说明:</p>
	 * <li></li>
	 * @author DuanYong
	 * @param exp 表达式
	 * @param data 原始数据
	 * @param value 值
	 * @since 2017年7月12日上午10:58:27
	 */
	public static void setExpressionValue(String exp, Map<String, Object> data, String value){
		try{
            if(!ExpressionParserHolder.getSpelExpressionParser().isPresent()){
                return;
            }
            ExpressionParserHolder.getSpelExpressionParser().get().setValue(exp, value, data);
		}catch(Exception ex){
			ex.printStackTrace();
            log.error("设置表达式值失败! 表达式:{}",exp);
		}
	}
	
}
